import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib
matplotlib.use('TkAgg')  # 指定 TkAgg 作为后端

# 设置字体为 SimHei（黑体）
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题


def draw_combined_heatmap_scatter(file_path, select_feature, output_path='./combined_heatmap_scatter.png', s=1,
                                  cmap="coolwarm"):
    """
    参数：
    - file_path: 输入文件路径，支持 Excel 格式。
    - select_feature: 目标列名称。
    - output_path: 输出图像保存路径，默认为 'combined_heatmap_scatter.png'。
    - cmap (str): 热图的配色方案，默认为 "coolwarm"。
    """
    # 读取数据
    df = pd.read_excel(file_path)
    df = df[select_feature]
    # 计算相关矩阵
    correlation_matrix = df.corr()

    # 获取变量数量
    n = len(correlation_matrix.columns)

    # 设置画布和网格布局
    fig, axes = plt.subplots(n, n, figsize=(12, 12))

    # 遍历矩阵，绘制下三角散点图和对角线部分
    for i in range(n):
        for j in range(n):
            ax = axes[i, j]  # 获取子图
            if i >= j:  # 下三角部分绘制散点图
                ax.scatter(df.iloc[:, j], df.iloc[:, i], alpha=0.5, s=s, color="blue")
                ax.set_xticks([])
                ax.set_yticks([])
            else:  # 上三角部分先留空
                ax.axis('off')

            # 添加列名标签
            if i == n - 1:  # 最底部的图添加 x 轴标签
                ax.set_xlabel(correlation_matrix.columns[j], fontsize=8, rotation=90)
            if j == 0:  # 最左侧的图添加 y 轴标签
                ax.set_ylabel(correlation_matrix.columns[i], fontsize=8, rotation=0, labelpad=40)

    # 单独绘制上三角热图
    mask = np.tril(np.ones_like(correlation_matrix, dtype=bool))  # 遮盖下三角
    sns.heatmap(
        correlation_matrix,
        mask=mask,  # 应用遮罩，只显示上三角
        annot=True,
        fmt=".2f",
        cmap=cmap,  # 彩色热图
        cbar=False,
        xticklabels=False,
        yticklabels=False,
        ax=fig.add_subplot(111, frameon=False)  # 添加到整个图上，作为背景
    )

    # 调整布局
    plt.subplots_adjust(wspace=0, hspace=0)  # 消除网格间隙
    plt.show()

    # 保存图像
    fig.savefig(output_path)
    print(f"图像已保存至: {output_path}")


draw_combined_heatmap_scatter(
    file_path='抗压强度.xlsx',  # 数据文件路径
    select_feature=["水用量（kg/m3）", "水泥ID", "水泥用量（kg/m3）", "粉煤灰用量（kg/m3）", "砂ID", "砂用量（kg/m3）",
                    "石ID", "石用量（kg/m3）", "减水剂ID", "减水剂掺量（%）", "增效剂ID", "增效剂掺量（%）"
                    ],
    output_path='combined_output.png',  # 输出文件路径
)
